home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
basic
/
bc7free.zip
/
FREE-M2.BAS
< prev
next >
Wrap
BASIC Source File
|
1990-03-27
|
4KB
|
119 lines
' Free2.Bas 03-27-90 T.E.M. Use Interrupt under BC 7.x & Mach2
' --------- Reports free disk space on 1 or more drives.
' --------- Remember to invoke QBX fn /lQBX <-- Note !
'$INCLUDE: 'QBX.BI'
DIM Regs AS RegType
Begin:
Clen% = LEN(COMMAND$)
IF Clen% > 0 THEN GOTO DoCmdTail
DoDefaultDriveOnly:
Regs.ax = &H1900 ' Current drv info: DOS service 19
Interrupt &H21, Regs, Regs
Q.Drive$ = CHR$((Regs.ax AND &HFF) + 65) + ":"
GOSUB Q.GetDiskInfo
GOSUB Q.ReportDiskInfo
SYSTEM
DoCmdTail:
FOR DriveLetters% = 1 TO Clen%
C$ = MID$(COMMAND$, DriveLetters%, 1)
DriveLetter% = INSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZ", C$)
IF DriveLetter% > 0 THEN
Q.Drive$ = C$
GOSUB Q.GetDiskInfo
GOSUB Q.ReportDiskInfo
END IF
NEXT DriveLetters%
SYSTEM
Q.GetDiskInfo:
Regs.ax = &H3600 ' Get Q.Drive$ free disk space
Regs.dx = ASC(UCASE$(Q.Drive$)) - 64
Interrupt &H21, Regs, Regs
Q.BytesPersector% = Regs.cx
Q.SectorsPerCluster% = Regs.ax
IF Regs.dx >= 0 THEN
Q.ClustersTotal% = Regs.dx
ELSE Q.ClustersTotal% = (Regs.dx + 65536)
END IF
IF Regs.dx >= 0 THEN
Q.ClustersAvail% = Regs.bx
ELSE Q.ClustersAvail% = (Regs.bx + 65536)
END IF
Q.ClustersAvail& = ABS(Q.ClustersAvail%) ' Convert to Long Integer
Q.ClustersTotal& = ABS(Q.ClustersTotal%)
Q.BytesPersector& = ABS(Q.BytesPersector%)
Q.SectorsPerCluster& = ABS(Q.SectorsPerCluster%)
Temp& = (Q.BytesPersector& * Q.SectorsPerCluster&)
Q.FreeSpace& = (Temp& * Q.ClustersAvail&)
Q.TotalSpace& = (Temp& * Q.ClustersTotal&)
Q.FreePct& = ((Q.ClustersAvail& * 100) \ Q.ClustersTotal&)
RETURN
'------
Q.ReportDiskInfo:
Lin$ = "Drive " + Q.Drive$ + " has "
S$ = STR$(Q.FreeSpace&)
GOSUB W.Commatize
S$ = SPACE$(11) + S$ ' Right justify
S$ = RIGHT$(S$, 11)
Lin$ = Lin$ + S$ + " bytes free ("
S$ = STR$(Q.FreePct&)
GOSUB W.Commatize
S$ = " " + S$
S$ = RIGHT$(S$, 3)
Lin$ = Lin$ + S$ + " %)" + CHR$(13) + CHR$(10)
CALL MhPrint(Lin$)
RETURN
'------
W.Commatize:
'Call with digital string in S$, returns S$ containing commas (longer!)
'If a decimal point is included, it is handled correctly.
S$ = LTRIM$(S$)
Temp$ = ""
FOR Temp% = 1 TO LEN(S$)
C$ = MID$(S$, Temp%, 1)
IsNumeric% = INSTR(".-0123456789", C$)
IF (IsNumeric% <> 0) THEN Temp$ = Temp$ + C$
NEXT Temp%
'Are there any decimal places?
Decimals$ = ""
Temp% = INSTR(Temp$, ".")
S$ = Temp$
SLen% = LEN(S$)
IF (Temp% <> 0) THEN
Decimals$ = RIGHT$(Temp$, ((SLen% - Temp%) + 1))
S$ = LEFT$(Temp$, (Temp%) - 1)
END IF
SLen% = LEN(S$): S2$ = ""
IF SLen% < 4 THEN S2$ = S$: GOTO W.Commatize.Exit
IF SLen% = 4 THEN S2$ = LEFT$(S$, 1) + "," + RIGHT$(S$, 3)
IF SLen% = 5 THEN S2$ = LEFT$(S$, 2) + "," + RIGHT$(S$, 3)
IF SLen% = 6 THEN S2$ = LEFT$(S$, 3) + "," + RIGHT$(S$, 3)
IF SLen% = 7 THEN S2$ = LEFT$(S$, 1) + "," + MID$(S$, 2, 3) + "," + RIGHT$(S$, 3)
IF SLen% = 8 THEN S2$ = LEFT$(S$, 2) + "," + MID$(S$, 3, 3) + "," + RIGHT$(S$, 3)
IF SLen% = 9 THEN S2$ = LEFT$(S$, 3) + "," + MID$(S$, 4, 3) + "," + RIGHT$(S$, 3)
IF SLen% = 10 THEN S2$ = LEFT$(S$, 1) + "," + MID$(S$, 2, 3) + "," + MID$(S$, 5, 3) + "," + RIGHT$(S$, 3)
IF SLen% = 11 THEN S2$ = LEFT$(S$, 2) + "," + MID$(S$, 2, 3) + "," + MID$(S$, 5, 3) + "," + RIGHT$(S$, 3)
IF SLen% = 12 THEN S2$ = LEFT$(S$, 3) + "," + MID$(S$, 2, 3) + "," + MID$(S$, 5, 3) + "," + RIGHT$(S$, 3)
W.Commatize.Exit:
IF S2$ <> "" THEN S$ = S2$
IF Decimals$ <> "" THEN S$ = S$ + Decimals$
RETURN